package br.com.dufs.mvc.controller;

import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.transaction.SystemException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.dufs.mvc.model.Benfeitori;
import br.com.dufs.mvc.model.DadosDaUPF;
import br.com.dufs.mvc.model.Entrevistado;
import br.com.dufs.mvc.model.Terras;
import br.com.dufs.mvc.service.BenfeitoriBOService;
import br.com.dufs.mvc.service.DadosDaUPFBOService;
import br.com.dufs.mvc.service.EntrevistadoBOService;
import br.com.dufs.mvc.service.TerrasBOService;

@Controller
@Scope("view")
public class DadosUPFMB {

	private boolean upfDisble = false;
	private boolean benfeitoriDisble = true;

	private DadosDaUPF dadosUPF = new DadosDaUPF();
	private DataModel<DadosDaUPF> listaDadosUPF;

	private Entrevistado entrevistado;

	private Benfeitori benfeitori;
	private DataModel<Benfeitori> listaBenfeitori;
	private List<Benfeitori> benfeitoriList;

	private Terras terra;
	private DataModel<Terras> listaTerras;
	private List<Terras> terrasList;

	@Autowired
	DadosDaUPFBOService dadosDaUPFBOService;
	@Autowired
	TerrasBOService terrasBOService;
	@Autowired
	BenfeitoriBOService benfeitoriBOService;
	@Autowired
	EntrevistadoBOService entrevistadoBOService;

	@PostConstruct
	public void filmeSelecionado() throws SystemException {
		String id = (String) FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap().get("id");

		if (id != null) {
			this.entrevistado = entrevistadoBOService.pesquisarPorId(id);
			if (getDadosDaUPF() != null) {
				preparaBenfeitoriTerra();
			}
		}
	}

	public DataModel<DadosDaUPF> getListar() {

		List<DadosDaUPF> lista = dadosDaUPFBOService.todos();

		listaDadosUPF = new ListDataModel<DadosDaUPF>(lista);
		return listaDadosUPF;
	}

	public Benfeitori getBenfeitori() {
		return benfeitori;
	}

	public void setBenfeitori(Benfeitori benfeitori) {
		this.benfeitori = benfeitori;
	}

	public DadosDaUPF getDadosDaUPF() throws SystemException {
		if (dadosDaUPFBOService.pesquisarPorId(entrevistado.getCpf()) != null) {
			dadosUPF = dadosDaUPFBOService
					.pesquisarPorId(entrevistado.getCpf());
		}
		return dadosUPF;
	}

	public void setDadosDaUPF(DadosDaUPF data) {
		this.dadosUPF = data;
	}

	public Terras getTerra() {
		return terra;
	}

	public void setTerra(Terras terra) {
		this.terra = terra;
	}

	public void prepararAdicionar(ActionEvent actionEvent) {
		this.dadosUPF = new DadosDaUPF();
	}

	public void prepararAlterar(ActionEvent actionEvent) {
		this.dadosUPF = (DadosDaUPF) (this.listaDadosUPF.getRowData());
	}

	public boolean isUpfDisble() {
		return upfDisble;
	}

	public void setUpfDisble(boolean upfDisble) {
		this.upfDisble = upfDisble;
	}

	public boolean isBenfeitoriDisble() {
		return benfeitoriDisble;
	}

	public void setBenfeitoriDisble(boolean benfeitoriDisble) {
		this.benfeitoriDisble = benfeitoriDisble;
	}

	public String excluir() {
		DadosDaUPF dadosUfTemp = (DadosDaUPF) (this.listaDadosUPF.getRowData());
		dadosDaUPFBOService.excluir(dadosUfTemp);
		return "entrevista2";

	}

	public void preparaBenfeitoriTerra() {
		benfeitori = new Benfeitori();
		terra = new Terras();
		benfeitoriList = new ArrayList<Benfeitori>();
		terrasList = new ArrayList<Terras>();
		setUpfDisble(true);
		setBenfeitoriDisble(false);

	}

	public void adicionar() throws SystemException {

		this.dadosUPF.setEntrevistado(entrevistado);
		if (benfeitoriList.size() > 0) {
			dadosUPF.setListaBenfeitoris(benfeitoriList);
		}
		if (terrasList.size() > 0) {
			dadosUPF.setListaTerras(terrasList);
		}
		this.dadosUPF.setCpfTitular(entrevistado.getCpf());

		if (dadosDaUPFBOService.pesquisarPorId(dadosUPF.getCpfTitular()) == null)
			dadosDaUPFBOService.salvar(dadosUPF);
		else
			dadosDaUPFBOService.atualizar(dadosUPF);

	}

	public void alterar(ActionEvent actionEvent) {

		dadosDaUPFBOService.atualizar(dadosUPF);

	}

	public Entrevistado getEntrevistado() {
		return entrevistado;
	}

	public void setEntrevistado(Entrevistado entrevistado) {
		this.entrevistado = entrevistado;
	}

	public DataModel<Terras> getListaTerras() {
		if (dadosUPF.getListaTerras() != null)
			listaTerras = new ListDataModel<Terras>(
					(List<Terras>) dadosUPF.getListaTerras());
		else
			listaTerras = new ListDataModel<Terras>(terrasList);
		return listaTerras;
	}

	public void excluirTerras() {

		Terras terrasTemp = (Terras) (this.listaTerras.getRowData());
		terrasList.remove(terrasTemp);
		if (terrasBOService.pesquisarPorId(terrasTemp.getIdTerra()) != null)
			terrasBOService.excluir(terrasTemp);

	}

	public void addTerras() {
		terra.setDadosUPF(dadosUPF);
		terrasBOService.salvar(terra);
		terrasList = (List<Terras>) dadosDaUPFBOService.pesquisarPorId(
				dadosUPF.getCpfTitular()).getListaTerras();
		terra = null;
		terra = new Terras();
	}

	public DataModel<Benfeitori> getListaBenfeitori() {
		if (dadosUPF.getListaBenfeitoris() != null)
			listaBenfeitori = new ListDataModel<Benfeitori>(
					(List<Benfeitori>) dadosUPF.getListaBenfeitoris());
		else
			listaBenfeitori = new ListDataModel<Benfeitori>(benfeitoriList);
		return listaBenfeitori;
	}

	public void excluirBenfeitori() {

		Benfeitori benfeitoriTemp = (Benfeitori) (this.listaBenfeitori
				.getRowData());
		benfeitoriList.remove(benfeitoriTemp);
		if (benfeitoriBOService
				.pesquisarPorId(benfeitoriTemp.getIdBenfeitori()) != null)
			benfeitoriBOService.excluir(benfeitoriTemp);

	}

	public void addBenfeitori() {
		benfeitori.setDadosUPF(dadosUPF);
		benfeitoriBOService.salvar(benfeitori);
		benfeitoriList = (List<Benfeitori>) dadosDaUPFBOService.pesquisarPorId(
				dadosUPF.getCpfTitular()).getListaBenfeitoris();
		benfeitori = null;
		benfeitori = new Benfeitori();
	}


}
